package com.smart.community.property.service;

import java.util.List;

import com.smart.community.commons.cache.DataScopeInfo;

/**
 * 数据权限控制服务
 * @author Wu.Liang
 * @since 2025-07-01
 */
public interface DataScopeService {
    // =============== 原有DataScopeService方法 ===============
    
    /**
     * 获取当前用户数据权限范围
     * @return 数据权限信息
     * @throws Exception 统一异常
     */
    DataScopeInfo getCurrentUserDataScope() throws Exception;
    
    /**
     * 获取用户数据权限范围
     * @param userId 用户ID
     * @return 数据权限信息
     * @throws Exception 统一异常
     */
    DataScopeInfo getUserDataScope(Long userId) throws Exception;
    
    /**
     * 检查用户是否有指定物业公司的权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasPropertyCompanyPermission(Long userId, Long propertyCompanyId) throws Exception;
    
    /**
     * 检查用户是否有指定社区的权限
     * @param userId 用户ID
     * @param communityId 社区ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasCommunityPermission(Long userId, Long communityId) throws Exception;
    
    /**
     * 检查用户是否有指定模块的权限
     * @param userId 用户ID
     * @param moduleCode 模块代码
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasModulePermission(Long userId, String moduleCode) throws Exception;
    
    /**
     * 批量验证用户物业公司权限
     * @param userId 用户ID
     * @param propertyCompanyIds 物业公司ID列表
     * @throws Exception 统一异常
     */
    void validateBatchPropertyCompanyPermission(Long userId, List<Long> propertyCompanyIds) throws Exception;
    
    /**
     * 批量验证用户是否有指定社区的权限
     * @param userId 用户ID
     * @param communityIds 社区ID列表
     * @throws Exception 统一异常
     */
    void validateBatchCommunityPermission(Long userId, List<Long> communityIds) throws Exception;
    
    /**
     * 获取用户关联的物业公司ID列表
     * @param userId 用户ID
     * @return 物业公司ID列表
     * @throws Exception 统一异常
     */
    List<Long> getUserPropertyCompanyIds(Long userId) throws Exception;
    
    /**
     * 根据物业公司ID列表获取用户ID列表
     * @param propertyCompanyIds 物业公司ID列表
     * @return 用户ID列表
     * @throws Exception 统一异常
     */
    List<Long> getUserIdsByPropertyCompanyIds(List<Long> propertyCompanyIds) throws Exception;
    
    /**
     * 获取用户有权限的社区ID列表
     * @param userId 用户ID
     * @return 社区ID列表
     * @throws Exception 统一异常
     */
    List<Long> getUserCommunityIds(Long userId) throws Exception;
    
    /**
     * 检查用户是否为物业公司用户
     * @param userId 用户ID
     * @return 是否为物业公司用户
     * @throws Exception 统一异常
     */
    boolean isPropertyCompanyUser(Long userId) throws Exception;
    
    /**
     * 获取用户有权限的社区ID列表
     * @param userId 用户ID
     * @return 社区ID列表
     * @throws Exception 统一异常
     */
    List<Long> getAuthorizedCommunityIds(Long userId, List<Long> communityIds) throws Exception;
    
    /**
     * 刷新用户权限缓存
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void refreshUserPermissionCache(Long userId) throws Exception;
    
    /**
     * 校验当前用户是否有指定社区的权限，无权限时抛出异常
     * @param communityId 社区ID
     * @throws Exception 统一异常
     */
    void hasCommunityPermission(Long communityId) throws Exception;
    
    // =============== 合并PropertyCompanyDataScopeService方法 ===============
    
    /**
     * 获取当前用户的数据权限范围（字符串格式，兼容旧接口）
     * @return 数据权限范围字符串
     * @throws Exception 统一异常
     */
    String getCurrentUserDataScopeString() throws Exception;
    
    /**
     * 获取用户的数据权限范围（字符串格式，兼容旧接口）
     * @param userId 用户ID
     * @return 数据权限范围字符串
     * @throws Exception 统一异常
     */
    String getUserDataScopeString(Long userId) throws Exception;
    
    /**
     * 检查当前用户是否为超级管理员
     * @return 是否为超级管理员
     * @throws Exception 统一异常
     */
    boolean isCurrentUserSuperAdmin() throws Exception;
    
    /**
     * 判断用户是否为超级管理员
     * @param userId 用户ID
     * @return 是否为超级管理员
     * @throws Exception 统一异常
     */
    boolean isUserSuperAdmin(Long userId) throws Exception;
    
    // =============== 新增业主权限相关方法 ===============
    
    /**
     * 检查用户是否为业主
     * @param userId 用户ID
     * @return 是否为业主
     * @throws Exception 统一异常
     */
    boolean isOwnerUser(Long userId) throws Exception;
    
    /**
     * 获取业主关联的房户ID列表
     * @param userId 用户ID
     * @return 房户ID列表
     * @throws Exception 统一异常
     */
    List<Long> getOwnerHouseholdIds(Long userId) throws Exception;
    
    /**
     * 根据物业公司ID数组获取业主在物业公司可见范围内的房户ID列表
     * @param userId 用户ID
     * @param propertyCompanyIds 物业公司ID数组
     * @return 房户ID列表
     * @throws Exception 统一异常
     */
    List<Long> getOwnerHouseholdIdsByPropertyCompanies(Long userId, List<Long> propertyCompanyIds) throws Exception;
    
    /**
     * 检查用户是否有指定房户的权限
     * @param userId 用户ID
     * @param householdId 房户ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasHouseholdPermission(Long userId, Long householdId) throws Exception;
    
    /**
     * 批量验证用户房户权限
     * @param userId 用户ID
     * @param householdIds 房户ID列表
     * @throws Exception 统一异常
     */
    void validateBatchHouseholdPermission(Long userId, List<Long> householdIds) throws Exception;
    
    /**
     * 获取用户有权限的房户ID列表
     * @param userId 用户ID
     * @param householdIds 待检查的房户ID列表
     * @return 有权限的房户ID列表
     * @throws Exception 统一异常
     */
    List<Long> getAuthorizedHouseholdIds(Long userId, List<Long> householdIds) throws Exception;
    
    /**
     * 清除所有权限缓存
     * @throws Exception 统一异常
     */
    void clearAllPermissionCache() throws Exception;
    
    // =============== 新增缺失的方法 ===============
    
    /**
     * 获取当前用户有权限的社区ID列表
     * @return 社区ID列表
     * @throws Exception 统一异常
     */
    List<Long> getCurrentUserCommunityIds() throws Exception;
    
    /**
     * 检查当前用户是否为物业公司用户
     * @return 是否为物业公司用户
     * @throws Exception 统一异常
     */
    boolean isCurrentUserPropertyCompanyUser() throws Exception;
    
    /**
     * 清除用户权限缓存
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void clearUserPermissionCache(Long userId) throws Exception;
} 